using Microsoft.AspNetCore.Mvc;
using SmartMedicalRAG.Core.Models;
using SmartMedicalRAG.Core.Services;

namespace SmartMedicalRAG.Api.Controllers;

/// <summary>
/// 根路径控制器 - 提供根路径的分诊分析功能
/// 作用：作为 API 的根路径入口，提供便捷的分诊分析服务
/// 功能：接收患者数据，进行智能分诊分析，返回处理结果
/// 路由：/ （根路径）
/// 特点：简化访问路径，适合快速集成和测试
/// </summary>
[ApiController]
[Route("")]
public class RootController : ControllerBase
{
    private readonly IRAGGenerationService _ragService;           // RAG 生成服务 - 负责检索增强生成
    private readonly IMultimodalDataService _multimodalService;   // 多模态数据服务 - 处理文本、语音、图像等
    private readonly ILogger<RootController> _logger;             // 日志记录器

    /// <summary>
    /// 构造函数 - 依赖注入初始化
    /// 作用：接收并初始化所需的服务依赖
    /// 说明：通过依赖注入获取 RAG 服务、多模态数据服务和日志记录器
    /// </summary>
    /// <param name="ragService">RAG 生成服务 - 负责智能分诊建议生成</param>
    /// <param name="multimodalService">多模态数据处理服务 - 处理各种类型的数据</param>
    /// <param name="logger">日志记录器 - 记录操作日志和错误信息</param>
    public RootController(
        IRAGGenerationService ragService,
        IMultimodalDataService multimodalService,
        ILogger<RootController> logger)
    {
        _ragService = ragService;
        _multimodalService = multimodalService;
        _logger = logger;
    }

    /// <summary>
    /// 根路径分诊分析 - 便捷的分诊处理入口
    /// 作用：提供根路径的分诊分析服务，简化 API 调用
    /// 访问路径：POST /
    /// 特点：
    /// - 简化访问路径，便于快速集成
    /// - 支持多模态数据处理
    /// - 提供完整的智能分诊建议
    /// - 包含结果验证和追溯来源
    /// 
    /// 处理流程：
    /// 1. 接收患者数据（文本、语音、图像、生理信号）
    /// 2. 多模态数据处理和分析
    /// 3. 构建患者数据模型
    /// 4. 调用 RAG 服务生成分诊建议
    /// 5. 验证建议的准确性
    /// 6. 获取支持证据和追溯来源
    /// 7. 返回完整的分析结果
    /// 
    /// 适用场景：
    /// - 快速集成测试
    /// - 简化客户端调用
    /// - 紧急情况下的快速分诊
    /// - 移动端应用的便捷访问
    /// </summary>
    /// <param name="request">患者分析请求 - 包含患者的所有相关数据</param>
    /// <returns>分诊响应 - 包含智能分析结果、建议和置信度</returns>
    /// <response code="200">成功返回分诊分析结果</response>
    /// <response code="400">请求数据格式错误或缺少必要信息</response>
    /// <response code="500">服务器内部错误或 AI 服务异常</response>
    [HttpPost]
    [ProducesResponseType(typeof(TriageResponse), 200)]
    [ProducesResponseType(400)]
    [ProducesResponseType(500)]
    public async Task<ActionResult<TriageResponse>> AnalyzePatientAsync([FromBody] PatientAnalysisRequest request)
    {
        try
        {
            // 记录请求开始，便于追踪和调试
            _logger.LogInformation("收到根路径分诊分析请求，患者主诉: {ChiefComplaint}", request.ChiefComplaint ?? "无主诉");
            
            // 步骤1：处理多模态数据 - 支持多种数据类型的智能处理
            var processedData = new List<ProcessedData>();
            
            // 处理文本数据（患者主诉、病史、医生记录等）
            if (!string.IsNullOrEmpty(request.TextData))
            {
                var textData = await _multimodalService.ProcessTextAsync(request.TextData);
                processedData.Add(textData);
            }
            
            // 处理语音数据（患者语音描述、症状描述等）
            if (request.VoiceData != null)
            {
                var voiceData = await _multimodalService.ProcessVoiceAsync(request.VoiceData);
                processedData.Add(voiceData);
            }
            
            // 处理图像数据（医学影像、皮肤病变、X光片等）
            if (request.ImageData != null)
            {
                var imageData = await _multimodalService.ProcessImageAsync(request.ImageData);
                processedData.Add(imageData);
            }
            
            // 处理生理信号数据（心电图、血压监测、体温曲线等）
            if (request.PhysiologicalData != null)
            {
                var signalData = await _multimodalService.ProcessPhysiologicalSignalAsync(request.PhysiologicalData);
                processedData.Add(signalData);
            }
            
            // 步骤2：构建完整的患者数据模型
            var patientData = new PatientData
            {
                ChiefComplaint = request.ChiefComplaint ?? "患者未提供主诉",
                Symptoms = request.Symptoms,
                VitalSigns = request.VitalSigns,
                MedicalHistory = request.MedicalHistory,
                ProcessedData = processedData
            };
            
            // 步骤3：调用 RAG 服务生成智能分诊建议
            // RAG 技术结合检索和生成，提供更准确的分诊建议
            var recommendation = await _ragService.GenerateTriageRecommendationAsync(patientData);
            
            // 步骤4：验证生成建议的准确性和可靠性
            // 确保建议符合医学标准和临床实践
            var isValid = await _ragService.ValidateRecommendationAsync(recommendation);
            
            // 步骤5：获取追溯来源，支持结果解释和审计
            // 提供支持建议的医学依据和知识来源
            var sources = await _ragService.GetTraceabilitySourcesAsync(recommendation);
            
            // 步骤6：构建完整的响应结果
            var response = new TriageResponse
            {
                Recommendation = recommendation,
                IsValid = isValid,
                TraceabilitySources = sources,
                ProcessingTime = DateTime.UtcNow,
                Confidence = recommendation.Confidence
            };
            
            // 记录处理完成，包含关键结果信息
            _logger.LogInformation("根路径分诊分析完成，推荐科室: {Department}, 置信度: {Confidence}", 
                recommendation.RecommendedDepartment, recommendation.Confidence);
            
            return Ok(response);
        }
        catch (Exception ex)
        {
            // 异常处理和日志记录
            _logger.LogError(ex, "根路径分诊分析失败");
            return StatusCode(500, new { error = "分诊分析失败", message = ex.Message });
        }
    }
} 